﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using personalplaner.common.mvvm;
using System.Windows;
using personalplaner.servicemodel.common;
using personalplaner.servicemodel.dataaccess;
using personalplaner.business.common;
using System.Collections.ObjectModel;
using System.Windows.Input;
using personalplaner.common.mvvm.commands;
using personalplaner.business.extensions;

namespace personalplaner.gui.common.viewmodels
{
	public class LoginDialogViewModel : BaseViewModel
	{
		public LoginDialogViewModel(DependencyObject parent)
			: base(parent)
		{
		}

        #region Implementation

        public override void Loaded()
        {
            base.Loaded();

            if (LoginData == null)
                return;

            if (string.IsNullOrEmpty(LoginData.UserName))
            {
                RaiseMoveFocus("LoginData.UserName");
                return;
            }

            if (string.IsNullOrEmpty(LoginData.Password))
            {
                RaiseMoveFocus("LoginData.Password");
                return;
            }
        }

        public void ReloadDatabases()
        {
            var da = GetService<IDatabaseDataAccess>();

            var dbs = new List<string>(da.GetDatabaseList(LoginData));

            DatabaseList.Clear();
            foreach (var db in dbs)
                DatabaseList.Add(db);

            if (dbs.Count > 0)
                return;

            // if no database was found then test the connection on the master db
            var tmpData = LoginData.Clone<LoginData>();
            tmpData.Database = "Master";

            if (!da.TestUserConnection(tmpData))
            {
                MessageBox.Show(Properties.Resources.IncorectUserOrPassword, "", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        #endregion

        #region Commands

        ICommand _okCommand;
        public ICommand OkCommand
        {
            get
            {
                if (_okCommand == null)
                    _okCommand = new RelayCommand(OnOk);
                return _okCommand;
            }
        }

        private void OnOk(object parameter)
        {
            if (string.IsNullOrEmpty(LoginData.DSN))
            {
                MessageBox.Show("Bitte wählen Sie einen Datenbank-Server aus", "", MessageBoxButton.OK);
                return;
            }

            if (string.IsNullOrEmpty(LoginData.Database))
            {
                MessageBox.Show("Bitte wählen Sie eine Datenbank aus", "", MessageBoxButton.OK);
                return;
            }

            try
            {
                var da = GetService<IDatabaseDataAccess>();
                if (!da.TestUserConnection(LoginData))
                {
                    MessageBox.Show("Mit den angegebenen Daten kann keine verbindung zum Datanbankserver aufgebaut werden.\nBitte überprüfen Sie den Benutzername und das Passwort.", "Verbindungsfehler", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
            }
            catch { }

            try
            {
                var da = GetService<IDatabaseDataAccess>();
                // Tsten ob die Datenbank die Tabelle zum Testen besitzt kompatibel ist
                if (da.TestDatabaseConnection(LoginData))
                {
                    LoginData.Serialize(LoginData);
                }
                else
                {
                    MessageBox.Show("Die ausgewählten Datenbank ist nicht \n kompatieble mit dem Personalplaner", "Verbindungsfehler", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
            }
            catch (Exception)
            {
                //Gencode.Common.Util.ErrorHandler.LoggError("Logon Error", "Logon.btnOK_Click", exp.Message);
                //Gencode.Common.Util.ErrorHandler.ShowError("Es ist ein Fehler beim Verbindungsaufbau entstanden.\nBitte überprüfen Sie die Datenbankverbindung oder kontaktieren Sie ihren Administrator.", "Anmeldefehler");
            }

            ((Window)Parent).DialogResult = true;
            ((Window)Parent).Close();
        }

        #endregion

        #region Properties

        LoginData _loginData;
		public LoginData LoginData
		{
			get
			{
				return _loginData;
			}
			set
			{
				_loginData = value;
				RaisePropertyChanged("LoginData");

                if (LoginData != null && !string.IsNullOrEmpty(LoginData.DSN))
                    SelectedOdbc = LoginData.DSN;
			}
		}

		string _selectedOdbc;
		public string SelectedOdbc
		{
			get
			{
				return _selectedOdbc;
			}
			set
			{
				_selectedOdbc = value;
				RaisePropertyChanged("SelectedOdbc");

				LoginData.DSN = value;

				var da = GetService<IDatabaseDataAccess>();
				var dbs = new List<string>(da.GetDatabaseList(LoginData));
				DatabaseList.Clear();
				foreach (var db in dbs)
					DatabaseList.Add(db);
			}
		}

		IList<string> _odbcList;
		public IList<string> OdbcList
		{
			get
			{
                if (_odbcList == null)
                {
                    var da = GetService<IDatabaseDataAccess>();
                    _odbcList = new List<string>(da.GetOdbcList());

                    if (_odbcList.Count > 0 && LoginData != null)
                        SelectedOdbc = LoginData.DSN;
                }
				return _odbcList;
			}
		}

		IList<string> _databaseList;
		public IList<string> DatabaseList
		{
			get
			{
				if (_databaseList == null)
					_databaseList = new ObservableCollection<string>();
				return _databaseList;
			}
			set
			{
				_databaseList = value;
				RaisePropertyChanged("DatabaseList");
			}
		}

		#endregion
	}
}
